package com.hup.utils.swing.customView.viewTable2;

import com.hup.utils.commons.DateBuilder;

import javax.swing.SwingConstants;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Date;
import java.util.List;

/**
 * @author hugan
 * @date 2024/5/28
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewTableColumn {

    /**
     * 列名
     */
    String name() default "";

    /**
     * 排序,从0开始;
     * 全部字段都缺省时,按类字段的顺序
     */
    int order() default 0;

    /**
     * 列宽
     */
    int width() default 0;

    /**
     * 列宽
     * 窗口缩放时,固定宽度
     * 有限度大于 width
     */
    int fixWidth() default 0;

    /**
     * 自定义[字段文本处理器];
     * 内置处理器: {@link VDateTextRenderer}, {@link VDatetimeTextRenderer}
     */
    Class<? extends VTextRenderer> textRender() default NullTextRenderer.class;

    /**
     * 是否可编辑
     */
    boolean editable() default false;

    /**
     * true-双击进入编辑模式,但不能修改值; 并且 更新editable=true
     */
    boolean editPreview() default false;

    /**
     * 表头 水平对齐方式:
     * {@link SwingConstants#CENTER},
     * {@link SwingConstants#LEFT},
     * {@link SwingConstants#RIGHT},
     */
    int headerAlignment() default SwingConstants.CENTER;

    /**
     * 数据行 (仅JLabel)水平对齐方式:
     * {@link SwingConstants#CENTER},
     * {@link SwingConstants#LEFT},
     * {@link SwingConstants#RIGHT},
     */
    int valueAlignment() default SwingConstants.CENTER;

    /**
     * 单元格左右padding
     */
    int paddingX() default 0;

    /**
     * 表头tooltip
     */
    String headerTooltip() default "";

    /**
     * @return true-本列是[序号列]
     */
    boolean isIndexColumn() default false;

    /**
     * 是否显示
     */
    boolean visible() default true;

    /**
     * 统计行处理器
     */
    Class<? extends VSummaryHandler> summaryHandler() default NullSummaryHandler.class;

    //===单元格文本渲染器
    interface VTextRenderer<T> {
        String get(T row, Object value);
    }

    class NullTextRenderer implements VTextRenderer<Object> {
        @Override
        public String get(Object row, Object value) {
            return null;
        }
    }

    class VDateTextRenderer implements VTextRenderer<Object> {
        @Override
        public String get(Object row, Object value) {
            //不作过多校验, 入参不对时, 运行时会报错
            return DateBuilder.ymd((Date) value);
        }
    }

    class VDatetimeTextRenderer implements VTextRenderer<Object> {
        @Override
        public String get(Object row, Object value) {
            //不作过多校验, 入参不对时, 运行时会报错
            return DateBuilder.ymdHms((Date) value);
        }
    }

    //===统计行处理器
    interface VSummaryHandler<T> {
        String get(List<T> allData);
    }

    class NullSummaryHandler implements VSummaryHandler<Object> {
        @Override
        public String get(List<Object> allData) {
            return null;
        }
    }

}
